home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / vdgear / src / play.c < prev    next >
Text File  |  1994-11-16  |  7KB  |  345 lines

  1. /*
  2.  *    VIDEO GEAR
  3.  *    "play.c"
  4.  *    by Good-Chy
  5.  */
  6.  
  7. #include    "video.h"
  8.  
  9. char    *sc1, *sc2, *sc3;
  10. int    mos_ctrl;
  11. int    fade_count;
  12.  
  13. int    mos_wait()
  14.     {
  15.     int    x,y,ch;
  16.  
  17.     do                    /* マウスが離されるのを待つ */
  18.         {
  19.         MOS_rdpos(&ch,&x,&y);
  20.         } while(ch != 0);
  21.  
  22.     do                    /* マウスが押されるのを待つ */
  23.         {
  24.         MOS_rdpos(&ch,&x,&y);
  25.         } while(ch == 0);
  26.     return    ch;
  27.     }
  28.  
  29. void    superimpose_bit(char *p)
  30.     {
  31.     int    x,y,i;
  32.  
  33.     x = WORD(p+0)+1;
  34.     y = WORD(p+2)+1;
  35.  
  36.     for (i=0 ; i<(y*x*2) ; i++, i++)
  37.         {
  38.         if ((*(p+i+6) == 0) && (*(p+i+7) == 0))
  39.             { *(p+i+7) = 0x80; }
  40.         }
  41.     }
  42.  
  43. int    load_next_picture(int stp)
  44.     {
  45.     int    i,x1,y1,x2,y2;
  46.     char    *p;
  47.  
  48.     if (stp < 48)
  49.         {
  50.         EGB_writePage(egb_work,0x80);
  51.         EGB_color(egb_work,1,0x8000);
  52.  
  53.         for (i=stp; i<48 ; i++)
  54.             {
  55.             if (data[i].picture.flag == 1)
  56.                 {
  57.                 if (strcmp(data[i].picture.name,"消去") == 0)
  58.                     {
  59.                     EGB_clearScreen(egb_work);
  60.                     return (i+1);
  61.                     }
  62.                 else
  63.                     {
  64.                     EGB_clearScreen(egb_work);
  65.                     p = tiff_load(data[i].picture.name);
  66.                     if (p != NULL)
  67.                         {
  68.                         x1 = data[i].picture.x*2;
  69.                         y1 = data[i].picture.y*2;
  70.                         x2 = WORD(p+0) + x1;
  71.                         y2 = WORD(p+2) + y1;
  72.                         superimpose_bit(p);
  73.                         put_vram((p+6),x1,y1,x2,y2);
  74.                         free(p);
  75.                         }
  76.                     return (i+1);
  77.                     }
  78.                 }
  79.             }
  80.         }
  81.     return (48);
  82.     }
  83.  
  84. void    play_init()
  85.     {
  86.     if (av_flag == 1)                    /* メモリが多い */
  87.         {
  88.         EGB_writePage(egb_work,0x81);
  89.         sc1 = get_vram(32,0,0,319,239);
  90.         EGB_writePage(egb_work,0x80);
  91.         sc2 = get_vram(16,0,0,639,479);
  92.         EGB_writePage(egb_work,0);
  93.         EGB_getPalette(0,pal_buff);
  94.         sc3 = get_vram(16,0,0,639,479);
  95.         }
  96.     else                            /* メモリが少ない */
  97.         {
  98.         EGB_writePage(egb_work,0x81);
  99.         sc1 = get_vram(32,0,60,319,239);
  100.         }
  101.  
  102.     screen2();
  103.     
  104.     mos_ctrl = MOS_getControl();            /* MOS_disp 無効 */
  105.     MOS_setControl(mos_ctrl & 0xfffffffe);
  106.  
  107.     EGB_superImpose(egb_work,sp_light);
  108.     SND_elevol_set(0,127,127);
  109.     sprint("  エディタで設定した内容を  ",32, 96,0x7fff,0,16,16,9);
  110.     sprint("  左クリックごとに実行します  ",32,112,0x7fff,0,16,16,9);
  111.     sprint("  又、右クリックで終了です  ",32,128,0x7fff,0,16,16,9);
  112.     }
  113.  
  114. void    effect_play(int i, int j)
  115.     {
  116.     int    fc;
  117.  
  118.     switch(i)
  119.         {
  120.         case     1:fc = 3;    stripe1(j);            break;
  121.         case     2:fc = 4;    stripe2(j);            break;
  122.         case     3:fc = 5;    wipe_up(j);            break;
  123.         case     4:fc = 2;    zoom_in(j);            break;
  124.         case     5:fc = 2;    verchcal_open(j);        break;
  125.         case     6:fc = 5;    wipe_down(j);        break;
  126.         case     7:fc = 2;    zoom_out(j);        break;
  127.         case     8:fc = 2;    verchcal_close(j);    break;
  128.         case     9:fc = 4;    wipe_left(j);        break;
  129.         case    10:fc = 10;    dizorve1(j);        break;
  130.         case    11:fc = 4;    hrizontal_open(j);    break;
  131.         case    12:fc = 4;    wipe_right(j);        break;
  132.         case    13:fc = 10;    dizorve2(j);        break;
  133.         case    14:fc = 4;    hrizontal_close(j);    break;
  134.         case    15:fc = 1;    nothing(j);            break;
  135.         }
  136.     fade_count = fc*fade_speed;
  137.     }
  138.  
  139. void    cd_fade_init(int loop)
  140.     {
  141.     switch(data[loop].cd.state)
  142.         {
  143.         case    0:            /* プレイ */
  144.             {
  145.             SND_elevol_set(1,max_vol,max_vol);
  146.             play_cd_da(data[loop].cd.track);
  147.             break;
  148.             }
  149.  
  150.         case    1:            /* ストップ */
  151.             {
  152.             cdr_pause(0);
  153.             break;
  154.             }
  155.  
  156.         case    2:            /* フェ-ドイン */
  157.             {
  158.             SND_elevol_set(1,0,0);    /* ボリュ-ム最小 */
  159.             cd_vol = 0;
  160.             play_cd_da(data[loop].cd.track);
  161.             flag[2] = 1;
  162.             break;
  163.             }
  164.  
  165.         case    3:            /* フェ-ドアウト */
  166.             {
  167.             cd_vol = max_vol;
  168.             flag[2] = 1;
  169.             break;
  170.             }
  171.         }
  172.     }
  173.  
  174. void    cd_fade_in()
  175.     {
  176.     cd_vol++;
  177.     SND_elevol_set(1,cd_vol,cd_vol);
  178.     if (cd_vol >= max_vol)        { flag[2] = 0; }
  179.     }
  180.  
  181. void    cd_fade_out()
  182.     {
  183.     cd_vol--;
  184.     SND_elevol_set(1,cd_vol,cd_vol);
  185.     if (cd_vol <= 0)
  186.         {
  187.         cdr_pause(0);
  188.         flag[2] = 0;
  189.         }
  190.     }
  191.  
  192. /******************************************************************************
  193.  *    プレイ・メイン
  194.  */
  195.  
  196. void    play()
  197.     {
  198.     unsigned    drive,drives;
  199.     int    i,loop,lp,fwait,ewait;
  200.  
  201.     max_vol = 127;
  202.     cd_vol  = 0;
  203.  
  204.     play_init();                    /* スタンバイ */
  205.     cdr_mstop(0);
  206.     lp = load_next_picture(0);
  207.     for (loop=0 ; loop<48 ; loop++)
  208.         {
  209.         if (data[loop].cd.flag == 1)
  210.             {
  211.             play_cd_da(data[loop].cd.track);
  212.             cdr_pause(0);
  213.             break;
  214.             }
  215.         }
  216.  
  217.     EGB_writePage(egb_work,0);
  218.     sprint("それでは、ビデオ機器の用意をして",32,152,0x7fff,0,16,16,9);
  219.     sprint("  左クリックでスタ-トです  ",32,168,0x7fff,0,16,16,9);
  220.     if (mos_wait() == 1)
  221.         {
  222.         EGB_color(egb_work,1,0x8000);
  223.         EGB_clearScreen(egb_work);
  224.  
  225.         for (loop=0 ; loop<48 ; loop++)
  226.             {
  227.             flag[0] = 0; flag[1] = 0; flag[2] = 0;
  228.             fade_count = 1;
  229.             ewait = 1;
  230.  
  231.             if (data[loop].mixing.flag == 1)    /* ミキシングが設定 */
  232.                 { vol_set(loop); }
  233.  
  234.             if (data[loop].sound.flag == 1)    /* 効果音の読み込み */
  235.                 {
  236.                 free(snd_bp);
  237.                 snd_bp = snd_load(data[loop].sound.name);
  238.                 }
  239.  
  240.             if (data[loop].effect.flag == 1)    /* ビデオ画像が設定 */
  241.                 {
  242.                 EGB_writePage(egb_work,1);
  243.                 EGB_dezitize(egb_work,1);
  244.                 EGB_dezitize(egb_work,0);
  245.                 if (data[loop].effect.spimpose == 0)
  246.                     { EGB_superImpose(egb_work,sp_light); }
  247.                 else    { EGB_superImpose(egb_work,   0); }
  248.                 if (mos_wait() == 2)    { break; }
  249.                 flag[0] = 2;
  250.                 }
  251.  
  252.             if (data[loop].picture.flag == 1)    /* パソコン画像が設定 */
  253.                 { flag[1] = 2; }
  254.  
  255.             if (data[loop].sound.flag == 1)    /* 効果音の再生 */
  256.                 {
  257.                 if (snd_bp == NULL)
  258.                     { snd_bp = malloc(1); }        /* dummy */
  259.                 else    { snd_play(snd_bp,data[loop].sound.vol); }
  260.                 }
  261.  
  262.             if (data[loop].cd.flag == 1)        /* CDが設定 */
  263.                 {
  264.                 cd_fade_init(loop);
  265.                 fwait = 1;
  266.                 }
  267.  
  268.             /* ステップ内でのル-プ */
  269.             while((flag[0] > 1) || (flag[1] > 1) || (flag[2] != 0))
  270.                 {
  271.                 ewait--;
  272.                 if (ewait == 0)
  273.                     {
  274.                     ewait = effect_speed*150-149;
  275.                     if (flag[0] > 1)    /* ビデオ画像のエフェクト中 */
  276.                         {
  277.                         effect_play(data[loop].effect.effect,0);
  278.                         }
  279.  
  280.                     if (flag[1] > 1)    /* パソコン画のエフェクト中 */
  281.                         {
  282.                         effect_play(data[loop].picture.effect,1);
  283.                         }
  284.                     }
  285.  
  286.                 if (flag[2] != 0)    /* CDフェ-ド */
  287.                     {
  288.                     if ((flag[0] < 2) && (flag[1] < 2))
  289.                         {
  290.                         fwait = 1;
  291.                         for (i=0 ; i<fade_speed ; i++)
  292.                             { wait_vsync(); }
  293.                         }
  294.                     fwait--;
  295.                     if (fwait == 0)
  296.                         {
  297.                         fwait = fade_count + effect_speed*150-149;
  298.                         switch(data[loop].cd.state)
  299.                             {
  300.                             case    2:cd_fade_in();    break;
  301.                             case    3:cd_fade_out();    break;
  302.                             }
  303.                         }
  304.                     }
  305.                 }
  306.  
  307.             if (flag[1] == 1)        /* パソコン画像読み込み */
  308.                 { lp = load_next_picture(lp); }
  309.  
  310.             if (mos_wait() == 2)    { break; }
  311.             }
  312.         }
  313.     EGB_superImpose(egb_work,0);
  314.     screen1();
  315.     MOS_setControl(mos_ctrl);            /* MOS_disp復活 */
  316.     mos_init();
  317.     cdr_mstop(0);
  318.     snd_init();
  319.  
  320.     if (av_flag == 1)                    /* メイン画面の復活 */
  321.         {
  322.         EGB_writePage(egb_work,0x81);
  323.         put_vram(sc1,0,0,319,239);
  324.         EGB_writePage(egb_work,0x80);
  325.         put_vram(sc2,0,0,639,479);
  326.         EGB_writePage(egb_work,0);
  327.         EGB_palette(egb_work,1,pal_buff);
  328.         put_vram(sc3,0,0,639,479);
  329.         free(sc1);
  330.         free(sc2);
  331.         free(sc3);
  332.         }
  333.     else
  334.         {
  335.         drive = *(work_path) - 'A' + 1;
  336.         _dos_setdrive(drive,&drives);
  337.         _chdir(work_path);
  338.         main_screen_load();
  339.         EGB_writePage(egb_work,0x81);
  340.         put_vram(sc1,0,60,319,239);
  341.         free(sc1);
  342.         }
  343.     step_print();
  344.     }
  345.